package com.zyx.xml.dom;

import javax.xml.parsers.*;
import java.io.*;
import java.nio.charset.StandardCharsets;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.resource.ClassPathResource;
import org.w3c.dom.*;
import org.w3c.dom.ls.*;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;

/**
 * Description:
 * <br/>10.2.6 使用DOM创建XML文档
 *
 * @author Yaxi.Zhang
 * @since 2022/9/25 10:06
 */
public class DomCreate {
    public static void main(String[] args) throws Exception {
        // DOM解析器工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setIgnoringElementContentWhitespace(true);
        // 获取DOM解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        //创建一个新的Document对象
        Document doc = builder.newDocument();
        // 设置XML版本
        doc.setXmlVersion("1.0");
        // 创建处理指令
        ProcessingInstruction pi = doc.createProcessingInstruction("crazyit", "href='http:/www.crazyit.org'");
        // 添加处理指令
        doc.appendChild(pi);
        Comment comment = doc.createComment("根元素之前的注释");
        doc.appendChild(comment);
        Element root = doc.createElement("student");
        // 为根元素添加学号属性
        root.setAttribute("学号", "1992121232");
        // 创建name元素
        Element item = doc.createElement("name");
        // 为name元素增加文本子节点
        item.appendChild(doc.createTextNode("张三"));
        // 将name元素添加到根元素下
        root.appendChild(item);
        // 创建age元素
        item = doc.createElement("age");
        // 为age元素增加文本子元素
        item.appendChild(doc.createTextNode("28"));
        // 将age元素添加到根元素下
        root.appendChild(item);
        // 创建high元素
        item = doc.createElement("high");
        // 为high元素添加文本子元素
        item.appendChild(doc.createTextNode("1.72"));
        // 将high元素添加到根元素下
        root.appendChild(item);
        // 创建score元素
        item = doc.createElement("score");
        // 创建Java元素
        Element lesson = doc.createElement("Java");
        // 为Java元素添加文本子元素。
        lesson.appendChild(doc.createTextNode("95"));
        // 将Java元素添加到score元素
        item.appendChild(lesson);
        // 创建Struts元素
        lesson = doc.createElement("Struts");
        // 为Struts元素添加文本子元素。
        lesson.appendChild(doc.createTextNode("90"));
        // 将Struts元素添加到score元素
        item.appendChild(lesson);
        // 创建Hibernate元素
        lesson = doc.createElement("Hibernate");
        // 为Hibernate元素添加文本子元素。
        lesson.appendChild(doc.createTextNode("90"));
        // 将Hibernate元素添加到score元素
        item.appendChild(lesson);
        // 将score元素添加到根元素下
        root.appendChild(item);
        // 为文档指定根元素
        doc.appendChild(root);

        // 获得DOMImplementationRegistry对象，它是获取DOMImplementation的工厂
        DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
        // 获取DOMImplementationLS对象
        DOMImplementationLS domImplLS = (DOMImplementationLS) registry.getDOMImplementation("LS");
        // 获取LSSerializer对象，它是专门用于序列化DOM树的的工具
        LSSerializer serializer = domImplLS.createLSSerializer();
        // 设置使用合理缩进使得XML文档更美观
        serializer.getDomConfig().setParameter("format-pretty-print", true);
        LSOutput out = domImplLS.createLSOutput();
        // 指定输出文档编码所用的字符集
        out.setEncoding(StandardCharsets.UTF_8.name());
        FileWriter stringOut = new FileWriter("./com-zyx-xml/src/main/resources/ch10_02/new.xml");

        out.setCharacterStream(stringOut);

        // 执行序列化（也就是将DOM树转换成XML文档）
        serializer.write(doc, out);
    }
}
